<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">

  <title>Wookmark PHP-Server Example</title>
  <meta name="description" content="An example for loading tiles for Wookmark from a server">
  <meta name="author" content="Christoph Ono, Sebastian Helzle">

  <meta name="viewport" content="width=device-width,initial-scale=1">

  <!-- CSS Reset -->
  <link rel="stylesheet" href="../bower_components/normalize.css/normalize.css">

  <!-- Global CSS for the page and tiles -->
  <link rel="stylesheet" href="../css/main.css">

</head>

<body>

  <div>
    <header>
      <h1>Wookmark PHP-Server Example</h1>
      <p>
        Scroll down to see more content loaded via a custom server script.
        <strong>This example needs to be run from a webserver with php!</strong>
      </p>
      <p><a href="../index.html">Back to overview</a></p>
    </header>

    <div role="main">

      <ul id="container" class="tiles-wrap animated">
        <!-- These is where we place content loaded from the Wookmark API -->
      </ul>

      <div id="loader">
        <div id="loaderCircle"></div>
      </div>

    </div>

    <footer>

    </footer>
  </div>

  <!-- include jQuery -->
  <script src="../bower_components/jquery/dist/jquery.min.js"></script>

  <!-- Include the imagesLoaded plug-in -->
  <script src="../bower_components/imagesloaded/imagesloaded.pkgd.min.js"></script>

  <!-- Include the plug-in -->
  <script src="../wookmark.js"></script>

  <!-- Once the page is loaded, initalize the plug-in. -->
  <script type="text/javascript">
    (function ($) {
      var wookmark = undefined,
          page = 1,
          isLoading = false,
          apiURL = 'server.php',
          lastRequestTimestamp = 0,
          fadeInDelay = 2000,
          container = '#container',
          $container = $(container),
          $loaderCircle = $('#loaderCircle'),
          $window = $(window),
          $document = $(document);

      /**
       * When scrolled all the way to the bottom, add more tiles.
       */
      function onScroll(event) {
        // Only check when we're not still waiting for data.
        if (!isLoading) {
          // Check if we're within 100 pixels of the bottom edge of the broser window.
          var closeToBottom = ($window.scrollTop() + $window.height() > $document.height() - 100);
          if (closeToBottom) {
            // Only allow requests every second
            var currentTime = new Date().getTime();
            if (lastRequestTimestamp < currentTime - 1000) {
              lastRequestTimestamp = currentTime;
              loadData();
            }
          }
        }
      };

      /**
       * Refreshes the layout.
       */
      function applyLayout($newImages) {
        $container.append($newImages);

        imagesLoaded(container, function () {
          // Destroy the old handler
          if (wookmark === undefined) {
            wookmark = new Wookmark(container, {
              offset: 2, // Optional, the distance between grid items
              itemWidth: 210 // Optional, the width of a grid item
            });
          } else {
            wookmark.initItems();
            wookmark.layout(true);
          }

          // Set opacity for each new image at a random time
          $newImages.each(function () {
            var $self = $(this);
            window.setTimeout(function () {
              $self.css('opacity', 1);
            }, Math.random() * fadeInDelay);
          });
        });
      };

      /**
       * Loads data from the API.
       */
      function loadData() {
        isLoading = true;
        $loaderCircle.show();

        $.ajax({
          url: apiURL,
          dataType: 'jsonp', // Set to jsonp if you use a server on a different domain and change it's setting accordingly
          data: {page: page}, // Page parameter to make sure we load new data
          success: onLoadData
        });
      };

      /**
       * Receives data from the API, creates HTML for images and updates the layout
       */
      function onLoadData(response) {
        isLoading = false;
        $loaderCircle.hide();

        // Increment page index for future calls.
        page++;

        // Create HTML for the images.
        var html = '',
            data = response.data,
            i = 0, length = data.length, image, opacity,
            $newImages;

        for (; i < length; i++) {
          image = data[i];

          html += '<li>';
          html += '<a target="_blank" href="'+image.image+'" title="'+image.title+'">';
          // Image tag (preview in Wookmark are 200px wide, so we calculate the height based on that).
          html += '<img src="'+image.preview+'" width="200" height="'+Math.round(image.height/image.width*200)+'">';
          html += '</a>';
          // Image title.
          html += '<p>'+image.title+'</p>';
          html += '</li>';
        }

        $newImages = $(html);

        // Disable requests if we reached the end
        if (response.message == 'No more pictures') {
          $document.off('scroll', onScroll);
        }

        // Apply layout.
        applyLayout($newImages);
      };

      // Capture scroll event.
      $document.on('scroll', onScroll);

      // Load first data from the API.
      loadData();
    })(jQuery);
  </script>

</body>
</html>
